// C语言实现题目描述:
// 东罗马帝国,里奥二世曾今让64名死刑犯站成一个圈,隔一个杀一个,杀到
// 剩下一个为止。并让所有死刑犯自己争抢位置,在如今也有这么一个类似的
// 问题:
// 设有n个人围坐一圈并按顺时针方向从1到n编号,从第1个人开始进行1到m
// 的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始1到m的报
// 数,如此进行下去直到所剩下一人为止。
// 输入描述:
// 输入多行,每行2个数,分别表示n和m。
// 输出描述:
// 计算每一行中最后剩下这个人的编号。
// 示例1:
// 输入:
// 10 3
// 输出:
// 4
// _____________________________________________________
// #include <stdio.h>
// #include <stdlib.h>
//
// int josephus_simulation(int n, int m) {
//     int *people = (int *)malloc(n * sizeof(int)); // 动态分配空间
//     for (int i = 0; i < n; i++) {
//         people[i] = 1; // 初始化所有人都在圈内
//     }
//
//     int count = 0, index = 0, remaining = n; // count用于计数，index表示当前编号
//
//     while (remaining > 1) {
//         if (people[index] == 1) { // 如果此人还在圈内
//             count++; // 报数
//             if (count == m) { // 报数到m时，出圈
//                 people[index] = 0; // 将该人标记为出圈
//                 remaining--; // 剩余人数减少
//                 count = 0; // 重置计数器
//             }
//         }
//         index = (index + 1) % n; // 顺时针移动到下一个人
//     }
//
//     // 找到剩下的最后一个人
//     for (int i = 0; i < n; i++) {
//         if (people[i] == 1) {
//             free(people); // 释放动态内存
//             return i + 1; // 编号从1开始
//         }
//     }
//     free(people); // 释放动态内存
//     return -1; // 理论上不会到这一步
// }
//
// int main() {
//     int n, m;
//     while (scanf("%d %d", &n, &m) != EOF) {
//         printf("%d\n", josephus_simulation(n, m));
//     }
//     return 0;
// }
//
//
// ___________第二种方法_________________________________________
// #include <stdio.h>
//
// int josephus_math(int n, int m) {
//     int result = 0; // 初始时，只有一个人时的结果
//     for (int i = 2; i <= n; i++) {
//         result = (result + m) % i; // 递推公式
//     }
//     return result + 1; // 转换为从1开始的编号
// }
//
// int main() {
//     int n, m;
//     while (scanf("%d %d", &n, &m) != EOF) {
//         printf("%d\n", josephus_math(n, m));
//     }
//     return 0;
// }
